<template>
    <div>
        <van-button class="button" type="primary" @click="creataAccount">助记词创建账号，同时用分层钱包创建keysroty</van-button>
        <van-button class="button" type="primary" @click="decryptWalletKeystory">钱包解密keystore</van-button>
        <br/>
        <van-button class="button" type="primary" @click="encryptAccounts">私钥和密码生成keystore</van-button>
        <van-button class="button" type="primary" @click="decryptAccount">解密keystore</van-button>
        <br/>
        <van-button class="button" type="primary" @click="mnemonicAccount"> 助记词获得地址和私钥</van-button>
        <van-button class="button" type="primary" @click="privateAccount"> 私钥获取地址</van-button>
        <p>地址：{{ myAccounts.address}}</p>
        <p>私钥: {{ myAccounts.private_key }}</p>
        <p>助记词: {{ myAccounts.mnemonic }}</p>

        <p>钱包生成keystore: {{ wallerkeystore }}</p>
        <p>钱包解析keystore: {{ decryptWallerKeystore }}</p>
        
        <p>账号密码生成keystore: {{ accountKeystore }}</p>
        <p>账号密码生成解析keystore: {{ decryptAccountKeystore }}</p>

        <p>助记词获得地址和私钥: {{ mnemonicAccountNumber }}</p>
        
    </div>
</template>
<script setup>
import { ref } from 'vue'
import * as bip39 from "bip39";
import ethwallet, { hdkey } from "ethereumjs-wallet";
import Web3 from 'web3'

// web3@1.8.1 
// bip39@3.0.4 W
// ethereumjs-tx@1.3.7 
// ethereumjs-util@7.1.5 
// ethereumjs-wallet@1.0.2 

// node-polyfill-webpack-plugin@2.0.1 -D 
// vant@4.0.7 
// unplugin-vue-components@0.22.12 -D 
// postcss-px-to-viewport@1.1.1 -D

let myAccounts = {
    address: "0xb98eb8b828d21cbfb417f58c084d2bb4b6dfdd33",
    private_key: "0xf8d6cc9f2bf049873e144b88226130113f7b9338221e24a550429d2b20379709",
    mnemonic: "history obscure craft pizza blush shrimp gesture increase bracket history display time"
    
}

var web3 = new Web3(Web3.givenProvider || 'wss://sepolia.infura.io/ws/v3/a87880aa11ba40b2bb8ed01b936b23f1');

var wallerkeystore = ref('')
var decryptWallerKeystore = ref('')
var accountKeystore = ref('')
var decryptAccountKeystore = ref('')
var mnemonicAccountNumber = ref('')

// 助记词创建账户
async function creataAccount(){
    // 1. 根据助记词生成密钥对 keypair
    // 创建助记词 
    let mnemonic = bip39.generateMnemonic();
    //将助记词生成种子seed
    let seed = await bip39.mnemonicToSeed(mnemonic);
    //通过hdkey将seed生成HD Wallet
    let hdWallet = hdkey.fromMasterSeed(seed);

    //生成钱包中在m/44'/60'/0'/0/i路径的keypair

    // m/purpse'/coin_type'/account'/change/address_index
    // purpose：在BIP43之后建议将常数设置为44'。表示根据BIP44规范使用该节点的子树。
    // Coin_type：币种，代表一个主节点（种子）可用于无限数量的独立加密币，如比特币，Litecoin或Namecoin。此级别为每个加密币创建一个单独的子树，避免重用已经在其它链上存在的地址。开发人员可以为他们的项目注册未使用的号码。
    // Account：账户，此级别为了设置独立的用户身份可以将所有币种放在一个的帐户中，从0开始按顺序递增。
    // Change：常量0用于外部链，常量1用于内部链，外部链用于钱包在外部用于接收和付款。内部链用于在钱包外部不可见的地址，如返回交易变更。
    // Address_index：地址索引，按顺序递增的方式从索引0开始编号。
    let keypair = hdWallet.derivePath("m/44'/60'/0'/0/0");  // 这里可以修改最后的索引，同一个助记词可以生成多个账号，后期也可以通过一个助记词找回
    console.log(keypair)
    // 2. 由keypair 获取钱包地址和私钥
    // 获取钱包对象
    let wallet = keypair.getWallet();
    // 获取钱包地址
    let lowerCaseAddress = wallet.getAddressString();
    // 获取钱包校验地址
    let CheckSumAddress = wallet.getChecksumAddressString();
    // 获取私钥
    let prikey = wallet.getPrivateKeyString();
    // console.log("lowerCaseAddress", lowerCaseAddress);
    // console.log("CheckSumAddress", CheckSumAddress);
    // console.log("prikey", prikey);
    let data = {
        address: lowerCaseAddress,
        prikey: prikey,
        mnemonic: mnemonic,

    }
    console.log(data);

    // 通过分层钱包对象 + 密码 创建keystore， 需要在创建账户的时候就生成
    let keystore = await wallet.toV3('q1111111')
    wallerkeystore.value = JSON.stringify(keystore); // 参数必须为 字符串

    return data
}

//  解析分层钱包生成的keystory
async function decryptWalletKeystory(){
    //  其实分层钱包和账号密码两种方法都可以解析出来keystore
    if (!wallerkeystore.value) {
        alert("keystore 不存在")
        return false;
    }
    let pass = prompt("q1111111");
    let wallet;
    try {
        wallet = await ethwallet.fromV3(wallerkeystore.value, pass);
    } catch (error) {
        console.log(error)
        alert("密码错误");
        return false;
    }
    decryptWallerKeystore.value = {
        address: wallet.getAddressString(),
        private_key: wallet.getPrivateKeyString(),
        mu: wallet.generateMnemonic
    }

}

// 账号密码生成的keystory
async function encryptAccounts(){
    // 通过私钥和密码创建 keystore
    const keystore = await web3.eth.accounts.encrypt(myAccounts.private_key,"q1111111");
    accountKeystore.value = JSON.stringify(keystore)
}

// 解析账号密码生成的keystory
async function decryptAccount(){
    if (!accountKeystore.value) {
        alert("keystore 不存在")
        return false;
    }
    let pass = prompt("q1111111");
    let key =  web3.eth.accounts.decrypt(accountKeystore.value,pass)
    decryptAccountKeystore.value = key
}

// 通过助记词获取地址和私钥
async function mnemonicAccount() {
    let mnemonic=prompt("请输入助记词")
    let seed = await bip39.mnemonicToSeed(mnemonic)   // 这个是
    let hdwallet = hdkey.fromMasterSeed(seed)
    let keypair = hdwallet.derivePath("m/44'/60'/0'/0/0");
    // 获取钱包对象
    let wallet = keypair.getWallet();
    // 获取钱包地址
    let lowerCaseAddress = wallet.getAddressString();
    // 获取钱包校验地址
    let CheckSumAddress = wallet.getChecksumAddressString();
    // 获取私钥
    let prikey = wallet.getPrivateKeyString()
    let a  = { 
        address: lowerCaseAddress,
        private_key: prikey
    }
    mnemonicAccountNumber.value = JSON.stringify(a)
    console.log(mnemonicAccountNumber.value);
}

// 通过私钥获取地址
function privateAccount(){
    // 这里记得要去掉0x
    let privatekey = new Buffer.from( prompt("请输入私钥").slice(2), 'hex')
    console.log(privatekey)
    let wallet = ethwallet.fromPrivateKey(privatekey)
    // 获取钱包地址
    let lowerCaseAddress = wallet.getAddressString();
    console.log("私钥获取地址",lowerCaseAddress);
}

</script>
<style>
.button{
    margin: 5px 10px;
}
</style>